package com.bonshotels.DomainLayer.DomainModel;

import java.io.Serializable;
import java.util.Map;
import java.util.TreeMap;

/**
 * La classe TipusHabitacio nomes aplica el patro expert d'assignacio de responsabilitats a classes i
 * el principi de disseny d'encapsulacio. Com que utilitzem el framework de persistencia
 * Hibernate i aquest utilitza reflexio per fer la seva feina les nostres classes han d'acomplir una
 * serie de propietats perque la reflexio del Hibernate pugui fer completament la seva feina, les
 * classes han de ser publiques, han de tenir un constructor public buit (si no en tenen un d'explicit
 * el per defecte ja ho es), han d'implementar Serializable, i han de tenir substituits (override) els
 * metodes equals() i hashCode() perque identifiquin les classes a partir de la seva clau natural.
 * Com que TipusHabitacio s'identifica pel seu nom, a l'hora
 * d'implementar equals(), hashCode() s'ha fet utilitzant aquesta clau.
 * @author Marc Mauri Alloza
 */
public class TipusHabitacio implements Serializable {

	/** La constant serialVersionUID. */
	private static final long serialVersionUID = -7600627041430076135L;

	/** El nom del tipus d'habitacio. */
	private String nom;
	
	/** La capacitat del tipus d'habitacio. */
	private int capacitat;
	
	/** La descripcio del tipus d'habitacio. */
	private String descripcio;
	
	/**
	 * Getter de serialversionuid.
	 *
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((nom == null) ? 0 : nom.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TipusHabitacio other = (TipusHabitacio) obj;
		if (nom == null) {
			if (other.nom != null)
				return false;
		} else if (!nom.equals(other.nom))
			return false;
		return true;
	}

	/**
	 * Prova si el tipus d'habitacio te nom nomTipus.
	 *
	 * @param nomTipus El nom del tipus que volem comprovar.  
	 * @return cert, si nomTipus es igual al nom del TipusHabitacio.
	 */
	boolean esTipus(String nomTipus) {
		return nomTipus == nom;
	}
	
	/**
	 * Prova si numOcup hi caben en aquell tipus d'habitacio, i a mes en retorna el nom del tipus.
	 *
	 * @param numOcup Nombre d'ocupants que volen ocupar l'habitacio.
	 * @return Un map amb el nom del tipus d'habitacio (key: "nomTipus") i si numOcup hi caben o no
	 * (key: "hiCaben")
	 */
	Map<String, Object> hiCaben(int numOcup) {
		Map<String, Object> dadesTipus = new TreeMap<String, Object>();
		dadesTipus.put("hiCaben", numOcup <= capacitat);
		dadesTipus.put("nomTipus", nom);
		return dadesTipus;
	}

	/**
	 * Getter de nom.
	 *
	 * @return El nom
	 */
	public String getNom() {
		return nom;
	}

	/**
	 * Setter del nom.
	 *
	 * @param nom El nou nom
	 */
	public void setNom(String nom) {
		this.nom = nom;
	}

	/**
	 * Getter de la capacitat.
	 *
	 * @return La capacitat
	 */
	public int getCapacitat() {
		return capacitat;
	}

	/**
	 * Setter de capacitat.
	 *
	 * @param capacitat La nova capacitat
	 */
	public void setCapacitat(int capacitat) {
		this.capacitat = capacitat;
	}

	/**
	 * Getter de descripcio.
	 *
	 * @return La descripcio
	 */
	public String getDescripcio() {
		return descripcio;
	}

	/**
	 * Setter de descripcio.
	 *
	 * @param descripcio La nova descripcio
	 */
	public void setDescripcio(String descripcio) {
		this.descripcio = descripcio;
	}
	
}
